import pika
from django.http import JsonResponse
from django.shortcuts import render
from rest_framework.views import APIView
from rest_framework.response import Response
from order import models, serorder
from tools.alipays import AliPaySDK


# class OrderCreateView(APIView):
#     def post(self, request):
#         # name: productInfo.value.attname + productInfo.value.ticketType,
#         # price: productInfo.value.price,
#         # ticket_id: productInfo.value.ticket_id,
#         # user_id: localStorage.getItem('userid'),
#         # num: 1,
#         # 假设订单信息在请求的 JSON 数据中
#         order_data = request.data
#
#         try:
#             # 连接到 RabbitMQ 服务器
#             connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
#             channel = connection.channel()
#
#             # 声明一个队列
#             channel.queue_declare(queue='order_queue')
#
#             # 发送订单信息到队列
#             channel.basic_publish(exchange='',
#                                   routing_key='order_queue',
#                                   body=order_data)
#
#             # 关闭连接
#             connection.close()
#
#             return JsonResponse({'message': '订单请求已接收，正在处理中'}, status=200)
#         except Exception as e:
#             return JsonResponse({'error': str(e)}, status=500)

# Create your views here.

class Createorder(APIView):
    def post(self, request):
        data = request.data
        print(data)
        try:
            order1 = models.Order.objects.create(**data)
            order1.save()
            ser = serorder.OrderSerializer(instance=order1, many=False)
            return Response({'code': 200, 'msg': '订单生成成功', 'data': ser.data})
        except:
            return Response({'code': 400, 'msg': '数据错误'})


class Orderlist(APIView):
    def get(self, request):
        userid = request.query_params.get('userid')
        orderlist = models.Order.objects.filter(user_id=userid, isdelete=False)
        ser = serorder.OrderSerializer(instance=orderlist, many=True)
        return Response({'code': 200, 'msg': 'ok', 'data': ser.data})


class Orderdetail(APIView):
    def get(self, request):
        ordernum = request.query_params.get('ordernum')
        print(ordernum)
        orderdetail = models.Order.objects.filter(ordernum=ordernum).first()
        if orderdetail.isdelete == True:
            return Response({'code': 400, 'msg': '订单已删除'})
        ser = serorder.OrderSerializer(orderdetail, many=False)
        return Response({'code': 200, 'msg': 'ok', 'data': ser.data})


class Paylink(APIView):
    '''订单支付链接'''

    def post(self, request):
        ordernum = request.data.get('ordernum')
        order = models.Order.objects.filter(ordernum=ordernum).first()
        if order:
            if order.status == 1:
                payprice = order.price
                alipay = AliPaySDK()
                url = alipay.page_pay(ordernum, payprice, f'{order.user.name[0]}xx在{order.create_time}的支付订单')
                return Response({'code': 200, 'msg': '请求成功', 'data': url})
            # 沙箱账号：  yptunf3258@sandbox.com
            # 密码： 111111

            else:
                return Response({"msg": "订单已支付或取消", "data": "", "code": 400})
        else:
            return Response({"msg": "订单不存在", "data": "", "code": 400})


class OrderPay(APIView):
    '''订单支付成功后的回调函数'''

    def get(self, request):
        try:
            data = request.query_params.dict()
            ordernum = data.get('out_trade_no')
            order = models.Order.objects.filter(ordernum=ordernum).first()
            if order:
                user = models.Users.objects.filter(id=order.user_id).first()
                order.statu = 2
                order.save()

                # 假设这里使用了异步任务或消息队列来处理后续逻辑
                # 例如，发送一个任务到 Celery 来检查订单状态并在必要时更新它

                # 这里只是模拟返回成功响应
                ascore = order.payprice * 0.01  # 注意：这里假设 order.pay 是已支付的金额
                user.score += ascore  # 注意：这里只是为了演示，实际上应该使用 F 表达式来避免竞态条件
                # 但由于我们在事务中，且只是示例，所以这样写也可以
                # 在生产环境中，应该避免在事务中直接修改然后立即查询同一对象，除非使用 F 表达式或其他同步机制

                # 注意：下面的代码实际上不会被执行，因为我们已经假设使用了异步处理
                # 而且，直接修改 user 对象并不会反映到数据库中，除非再次调用 save()
                # 但由于我们已经在事务中修改了 order，且这里只是示例，所以保留这段注释掉的代码以说明意图
                # if order.status != '已取消':  # 注意：这里的检查实际上在异步任务中执行
                #     order.status = '已完成'
                #     order.save()
                #     user.save()  # 在实际代码中，这里应该使用异步更新或确保事务的一致性
                user.save()
                # 由于我们假设使用了异步处理，这里直接返回成功响应
                ser = serorder.OrderSerializer(order)
                return Response(
                    {"msg": "请求成功", "data": ser.data, "code": 200})
            else:
                return Response({"msg": "订单不存在", "data": "", "code": 400})

        except Exception as e:
            return Response({"msg": "请求失败", "data": str(e), "code": 500})
